package fiuba.algo3.juego;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Observable;

import org.jdom2.Element;

import fiuba.algo3.dificultad.DificultadDePartida;
import fiuba.algo3.partida.Partida;
import fiuba.algo3.vehiculo.Vehiculo;

public class JuegoGPS extends Observable{
	
	String usuarioActual;
	Partida miPartida;
	LinkedList<Puntaje> puntajesMaximos;
	LinkedList<String> jugadoresGuardados;
	
	public JuegoGPS(){
		miPartida = null;
		puntajesMaximos = new LinkedList<Puntaje>();
		jugadoresGuardados = new LinkedList<String>();
		
	}
	
	public void setUsuarioActual(String unUsuario){
		this.usuarioActual = unUsuario;
	}
	
	public String getUsuarioActual(){
		return this.usuarioActual;
	}
	
	public void nuevaPartidaConDificultad(DificultadDePartida unaDificultad){
		miPartida = new Partida(unaDificultad);
		miPartida.setUsuarioActual(this.usuarioActual);
	}
	
	public void crearPartidaCon(Vehiculo unVehiculo){
		miPartida.cargarVehiculoEnMapa(unVehiculo);
	}
	
	public void setPartida(Partida nuevaPartida){
		this.miPartida = nuevaPartida;
	}
	
	public LinkedList<String> getUsuariosRegistrados(){		
		return jugadoresGuardados;	
	}
	
	public boolean agregarNuevoJugador(String unJugador){
		for(int i = 0; i< jugadoresGuardados.size(); i++){
	        if(jugadoresGuardados.get(i).equals(unJugador) ){
	        	return false;
	        }
		}
		jugadoresGuardados.add(unJugador);
		return true;
	}
	
	public LinkedList<Puntaje> getPuntajesMaximos(){
		return this.puntajesMaximos;
	}
	
	@SuppressWarnings("unchecked")
	public void agregarNuevoPuntajeMaximo(Puntaje unPuntaje){
		this.puntajesMaximos.add(unPuntaje);	
		Collections.sort(puntajesMaximos);
	}	
	
	public void ActualizarObservadores(){
		setChanged();
		notifyObservers();		
	}
	
	public int getCantidadDeMovimientos(){
		return this.miPartida.getCantidadDeMovimientos();
	}
	
	public void moverVehiculoArriba(){
		miPartida.moverVehiculoArriba();
		ActualizarObservadores();
	}
	
	public void moverVehiculoAbajo(){
		miPartida.moverVehiculoAbajo();
		ActualizarObservadores();
	}
	
	public void moverVehiculoDerecha(){
		miPartida.moverVehiculoDerecha();
		ActualizarObservadores();
	}
	
	public void moverVehiculoIzquierda(){
		miPartida.moverVehiculoIzquierda();
		ActualizarObservadores();
	}
	
	public Partida getPartida(){
		return miPartida;
	}
	
	
	public Element serializar(){	
		Element nodoJuegoGPS = new Element("JuegoGPS");
		Element nodoListaUsuarios = new Element("jugadoresGuardados");
		for(int i = 0; i< jugadoresGuardados.size(); i++ ){
			Element jugador = new Element("String");
			jugador.setAttribute("nombre", jugadoresGuardados.get(i));
			nodoListaUsuarios.addContent(jugador);
		}
		
		Element nodoListaPuntajesMaximos = new Element("puntajesMaximos");
		
		for(int i = 0; i < puntajesMaximos.size(); i++){
			nodoListaPuntajesMaximos.addContent(puntajesMaximos.get(i).serializar());
		}
		nodoJuegoGPS.addContent(nodoListaPuntajesMaximos); 

		
		nodoJuegoGPS.addContent(nodoListaUsuarios);
		return nodoJuegoGPS;
		
	}

		
	public JuegoGPS(Element nodo){
		miPartida = null;
		puntajesMaximos = new LinkedList<Puntaje>();
		jugadoresGuardados = new LinkedList<String>();
		
		Element listaDeJugadores = nodo.getChild("jugadoresGuardados");
		List<Element> nombres = listaDeJugadores.getChildren();
		for(int i = 0; i < nombres.size(); i++){
			jugadoresGuardados.add(nombres.get(i).getAttributeValue("nombre"));
		}

		Element listaDePuntajesMaximos = nodo.getChild("puntajesMaximos");
		List<Element> puntajes = listaDePuntajesMaximos.getChildren();
		for(int i = 0; i < puntajes.size(); i++){
			puntajesMaximos.add(new Puntaje(puntajes.get(i)));
		}

	}
		
}


